// function foo(){
//   var a = 10;
//   b = 10;
// }
// foo()
// console.log(a);

/**
 * 声明变量 var let const
 * var特点：
 *  1.可以重复声明
 *    console.log(a);
 *    var a = 10;
 *  2.会进行变量提升,不存在暂时性死区(一个变量可以在声明之前访问)
 *  3.不存在块级作用域 
 *    if(true){
        var a = 10;
      }
      console.log(a);
 *  4.可以声明变量不进行初始化 var a;
 */

/**
 * let特点:
 *  1.不可以重复声明变量
 *      let a = 10;
        let a = 'hello';//报错
    2.不会变量提升，存在暂时性死区
      console.log(a);
      let a = 10;//报错 无法访问在初始化a变量之前
    3.存在块级作用域 
    if(true){
      let a = 10;
    }
    console.log(a);
    4.可以声明变量不进行初始化 
      let a;
      console.log(a);//undefined
 *  
 */

/**
 * const特点：
 *  1.不会进行变量提升,存在暂时性死区
 *    console.log(a);
      const a = 10;//报错
 *  2.不可以重复声明变量
      const a = 10;
      const a = 20;//报错
    3.存在块级作用域
      if(true){
        const a = 10;
      }
      console.log(a);
    4.const声明变量必须进行初始化 const a = 10;
    5.const一旦声明初始化就不可以更改，一般用于声明常量。
 */
// const a = 10;
// a = 'hello';
// console.log(a);
// const obj = {
//   name:'zhangsan'
// };
// obj.age = 20;
// console.log(obj);


// console.log(typeof function(){});

// let sy1 = Symbol('sy1');
// console.log(sy1,typeof sy1);

// console.log(typeof (BigInt(Number.MAX_VALUE) * 3n));

// var obj = {
//   name:'zhangsan'
// }
// var obj1 = obj;
// console.log(obj1 === obj);//true
// JSON.stringify 将对象转为json字符串 
// var res = JSON.stringify(obj);
// console.log(res,typeof res);
// 将json字符串对象转为普通对象
// var obj1 = JSON.parse(res);
// console.log(obj === obj1);


// console.log(0 === false);
// console.log(null === undefined);
// console.log(10 + true);
// console.log('1' == true);
// console.log([] + []);
// console.log({} + {});
// console.log([].toString(),typeof ([].toString()));
// console.log({}.toString(),typeof ({}.toString()));

// var obj = {
//   name:'zhangsan',
//   age:12
// };
// for(let key in obj){
//   console.log(key,obj[key]);
// }
// var obj = {
//   name:"zhangsan"
// };
// console.log(Object.prototype.constructor === Object);
// console.log(obj.__proto__ === Object.prototype);
// console.log(obj.toString());

// 静态方法 ：构造函数本身调用的方法就是静态方法
//   Object Array
// 实例方法：原型对象上的方法 
//   obj.toString() obj.valueOf() 

// console.log(this);
// console.log(module.exports === this);

// function foo() {
// console.log(this);
// }
// foo()

// var obj = {
//   name:'李四',
//   sayName:function(){
//     console.log(this.name,'2222')
//   }
// }
// obj.sayName();//李四 
// let res = obj.sayName;
// res();//undefined this指向就是全局对象 
// res.call(obj)



/**
 * 闭包
 */
// function foo(){
//   var a = 10;
//   a--;
//   console.log(a);
// }
// foo();
// foo();
// function foo() {
//   var a = 10;
//   return function () {
//     a--;
//     console.log(a);//9
//   }
// }
// var res = foo();
// res();
// res();
// res();


var arr = [1, 2, 3, 4, 5];
for (let index of arr) {
    console.log(index);
}